package com.kangye.game.controller;

import com.alibaba.fastjson.JSON;
import com.github.qcloudsms.SmsSingleSender;
import com.github.qcloudsms.SmsSingleSenderResult;
import com.github.qcloudsms.httpclient.HTTPException;
import com.kangye.game.pojo.Sms;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * @program: game_orders
 * @description: 用户注册控制器
 * ---- @CrossOrigin--前后端分离跨域专用
 * @author: lys
 * @create: 2021-09-01 19:14
 * @Resource--设置RedisTemplate的key的类型和值的类型 private RedisTemplate<String,String> redisTemplate;
 **/
@RestController
@CrossOrigin
public class RegisterController {
    @Resource
    private RedisTemplate<String, String> redisTemplate;

    @RequestMapping("/SmsCode.action")
    @ResponseBody
    public Object getSmsCode(String tel) throws HTTPException, IOException {
        //应用Id
        int appid = 1400489804;
        //应用Id
        String appkey = "a765ed36a300006f070a49bf84c20698";
        //正文模板Id
        int templateId = 881993;
        //签名内容
        String smsSign = "webhan";
        //设置短信返回内容
        SmsSingleSenderResult smsSingleSenderResult = null;
        //设置短信的有效时间
        int min = 5;
        //设置发送给用户的验证码(且字符串需要为“”--=不可为null)
        String code = "";
        Random random = new Random();
        for (int i = 0; i < 6; i++) {
            //随机组成6位数的验证码
            code += random.nextInt(10);
        }
        //将所有的值设置到实体类Sms中;
        Sms sms = new Sms();
        sms.setCode(code);
        sms.setMin(min);
        sms.setTel(tel);
        //将sms转化为json类型的值,并添加到list集合中(string类型的可存储json)
        List<String> smss = new ArrayList<>();

        smss.add(JSON.toJSONString(sms));

        //List类型(redis数据库中关于list类型的方法)
        ListOperations opsForList = redisTemplate.opsForList();
        //获取当前key的List列表长度--本人会在redis以tel为key
//        long size = opsForList.size(tel);
//        if(size > 0){
        //移除并获取列表中第一个元素
//            opsForList.leftPop(tel);
        //把多个值存入redis数据库的List类型中，并且让tel为key(键)
//            opsForList.leftPushAll(tel,smss);
        //设置有效时间
//            redisTemplate.expire(tel,300, TimeUnit.SECONDS);
//        }else {
        //把多个值存入List中
        opsForList.leftPushAll(tel, smss);
        //设置有效时间
        redisTemplate.expire(tel, 300, TimeUnit.SECONDS);
//        }
        //设置验证码和有效时间的数组

        String[] params = {code, min + ""};
        System.out.println(params[0]);
        //连接第三方（腾讯云） 参数为应用Id和应用Id
        SmsSingleSender sender = new SmsSingleSender(appid, appkey);
        //设置要返回参数
        smsSingleSenderResult = sender.sendWithParam("86", tel, templateId, params, smsSign, "", "");
        return smsSingleSenderResult;
    }

    @RequestMapping("/Register.action")
    public Object getRegister(String code, String tel) {
        System.out.println(code + "------" + tel);
        //获取列表指定范围内的元素(start开始位置, 0是开始位置，end 结束位置, -1返回所有)
        List<String> strings = redisTemplate.opsForList().range(tel, 0, -1);
        //遍历redis数据库中的内容，并添加到list<sms>集合中
        List<Sms> smss = new ArrayList<>();
        for (String s : strings) {
            smss.add(JSON.parseObject(s, Sms.class));
        }

        Map<String, String> map = new HashMap<>();

        //将List<Sms>中的第一个也就是下标为0的数据给Sms(最新的验证码)
        Sms sms = smss.get(0);
        if (sms.getTel().equals(tel) && sms.getCode().equals(code)) {
            String num = JSON.toJSONString("200");
            map.put("code", num);
        } else {
            String num = JSON.toJSONString("400");
            map.put("code", num);
        }
        return map;
    }
}
